package com.malou.client.pagos.pagoletras;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.grid.filters.DateFilter;
import com.extjs.gxt.ui.client.widget.grid.filters.DateFilter.DateFilterMessages;
import com.extjs.gxt.ui.client.widget.grid.filters.GridFilters;
import com.extjs.gxt.ui.client.widget.grid.filters.NumericFilter;
import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.malou.client.MalouConstants;
import com.malou.client.MalouMessages;
import com.malou.client.util.RemoteStoreFilterField;
import com.malou.client.util.Utilities;

public class LetrasPendientesPanel extends ContentPanel {
	private MalouConstants k = GWT.create(MalouConstants.class);
	private MalouMessages msg = GWT.create(MalouMessages.class);

	private Button btnDelete;
	private Button btnNuevo;
	private Button btnCancelar;
	private Button btnRenovar;
	private ToolBar toolbar;
	private PagingToolBar toolBarPag;

	private List<ColumnConfig> columns;
	private CheckBoxSelectionModel<BeanModel> sm;
	private ColumnModel cm;
	public Grid<BeanModel> grid;

	private BeanModel selectedModel;

	private List<BeanModel> selectedModels;
	private Integer selectedSize;

	private Listener<MessageBoxEvent> listener;
	private SelectionListener<ButtonEvent> sl_delete;

	private Listener<MessageBoxEvent> ls_cancelar;
	private SelectionListener<ButtonEvent> sl_cancelar;

	private GridFilters filters;
	@SuppressWarnings("unused")
	private String text = null;
	private RemoteStoreFilterField<BeanModel> filterField;

	public RenovarLetraDialog renovarletradialog;

	private Date fechaactual = new Date();


	@SuppressWarnings({ "rawtypes", "unchecked" })
	public LetrasPendientesPanel() {
		super();
		setBodyBorder(false);
		setBorders(false);
		setHeaderVisible(false);
		setIcon(IconHelper.createPath("images/icons/table.png"));
		setLayout(new FitLayout());

		Letras.getPaginate();

		renovarletradialog = new RenovarLetraDialog();
		renovarletradialog.setStore(Letras.store);

		btnDelete = new Button(k.eliminar(),
				IconHelper.createPath("images/icons/delete.gif"));
		btnDelete.setEnabled(false);

		btnCancelar = new Button(k.letraCancelar(),
				IconHelper.createPath("images/icons/cancelar.png"));
		btnCancelar.setEnabled(false);
		btnNuevo = new Button(k.agregar(),
				IconHelper.createPath("images/icons/new.gif"));
		btnRenovar = new Button(k.letraRenovar(),
				IconHelper.createPath("images/icons/renovar.png"));
		btnRenovar.setEnabled(false);
		toolbar = new ToolBar();

		DateFilter fechaFilter = new DateFilter("fechavencimiento");

		DateFilterMessages dm = new DateFilterMessages();
		dm.setAfterText(k.despues());
		dm.setBeforeText(k.antes());
		dm.setOnText(k.del());
		fechaFilter.setMessages(dm);

		filters = new GridFilters();
		filters.addFilter(new StringFilter("proveedor"));
		filters.addFilter(new StringFilter("ruc"));
		filters.addFilter(new StringFilter("dni"));
		filters.addFilter(new StringFilter("banco"));
		filters.addFilter(new StringFilter("numeroletra"));
		filters.addFilter(new StringFilter("numerodocumento"));
		filters.addFilter(new NumericFilter("monto"));
		filters.addFilter(fechaFilter);

		filterField = new RemoteStoreFilterField() {

			@Override
			protected void handleOnFilter(String filter) {
				if (filter == null || filter.equals(""))
					text = null;
				else
					text = filter.toLowerCase();
				Letras.filter = filter;
				Letras.loader.load();
			}

			@Override
			protected boolean doSelect(Store store, ModelData parent,
					ModelData record, String property, String filter) {
				String name = record.get("nombres");

				name = name.toLowerCase();

				if (name.startsWith(filter.toLowerCase())) {
					return true;
				}
				return false;
			}
		};
		filterField.bind(Letras.store);
		filterField.setEmptyText(k.letraBuscar());
		filterField.setWidth(250);

		Label label = new Label(k.letrasProveedor() + ":");
		label.setStyleAttribute("marginLeft", "10px");

		toolbar.add(btnNuevo);
		toolbar.add(new SeparatorToolItem());
		toolbar.add(btnRenovar);
		toolbar.add(new SeparatorToolItem());
		toolbar.add(btnCancelar);
		toolbar.add(new SeparatorToolItem());

		toolbar.add(btnDelete);
		toolbar.add(new SeparatorToolItem());
		toolbar.add(label);
		toolbar.add(filterField);

		toolBarPag = new PagingToolBar(Utilities.itemsPerPage);
		toolBarPag.bind(Letras.loader);

		columns = new ArrayList<ColumnConfig>();

		sm = new CheckBoxSelectionModel<BeanModel>();

		columns.add(sm.getColumn());
		columns.add(new ColumnConfig("proveedor", k.letrasProveedor(), 200));
		columns.add(new ColumnConfig("ruc", k.proveedorRuc(), 100));
		columns.add(new ColumnConfig("dni", k.proveedorDni(), 100));
		columns.add(new ColumnConfig("banco", k.letraBanco(), 150));
		columns.add(new ColumnConfig("numeroletra", k.letraNumeroUnico(), 100));
		columns.add(new ColumnConfig("numerodocumento", k.letraNumeroDocumento(), 100));
		columns.add(new ColumnConfig("monto", k.letraMonto(), 100));

		GridCellRenderer<BeanModel> fecha = new GridCellRenderer<BeanModel>() {
			@Override
			public Object render(BeanModel model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<BeanModel> store, Grid<BeanModel> grid) {
					
				DateTimeFormat dateFormat = DateTimeFormat.getFormat("yyyy-MM-dd");
				String style = "";
				Date fechavencimiento = (Date) model.get(property);

				Integer anioactual = getAnio(fechaactual);
				Integer aniovencimiento = getAnio(fechavencimiento);

				Integer mesactual = getMes(fechaactual);
				Integer mesvencimiento = getMes(fechavencimiento);

				Integer diaactual = getDia(fechaactual);
				Integer diavencimiento = getDia(fechavencimiento);

				
				
				Integer mesdiasactual=Utilities.diaMes(mesactual, anioactual);	
				Integer mesdiasvencimiento=Utilities.diaMes(mesvencimiento, aniovencimiento);	
				
				Integer suma =diavencimiento-diaactual; 
				Integer diferencia = (diaactual+mesdiasactual) - (mesdiasvencimiento-diavencimiento);
                     
				if(anioactual<aniovencimiento)
					return dateFormat.format(fechavencimiento);
							
					if (fechavencimiento.compareTo(fechaactual) > 0) {
					
						if ((mesvencimiento - mesactual) == 1) {
							if (diferencia <= 2)
								style = "green";
							if (diferencia > 2 && diferencia <= 5)
								style = "blue";
						}
						if (mesvencimiento == mesactual) {
							if (suma <= 2 && suma > 0)
								style = "green";
							if (suma == 0)
								style = "red";
							if (suma > 2 && suma <= 5)
								style = "blue";

						}

					} else if (fechavencimiento.compareTo(fechaactual) < 0)
						style = "red";

				return "<span qtitle='"
						+ cm.getColumnById(property).getHeader() + "' qtip='"
						+ fechavencimiento
						+ "' style='font-weight: bold;color:" + style + "'>"
						+ dateFormat.format(fechavencimiento) + "</span>";
			}
		};
        
		ColumnConfig column = new ColumnConfig("fechavencimiento",	k.letraFechaVencimiento(), 80);
		column.setRenderer(fecha);
		

		columns.add(column);

		cm = new ColumnModel(columns);

		grid = new Grid<BeanModel>(Letras.store, cm);
		grid.setAutoExpandColumn("proveedor");
		grid.addPlugin(sm);
		grid.setLoadMask(true);
		grid.addPlugin(filters);
		grid.setSelectionModel(sm);


		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						selectedSize = be.getSelection().size();

						if (selectedSize == 0) {
							btnDelete.setEnabled(false);
							btnCancelar.setEnabled(false);
							btnRenovar.setEnabled(false);
							btnNuevo.setEnabled(true);
							renovarletradialog.unbind();

						} else if (selectedSize == 1) {
							selectedModel = be.getSelectedItem();

							renovarletradialog.bind(selectedModel);

							btnCancelar.setEnabled(true);
							btnNuevo.setEnabled(false);
							btnRenovar.setEnabled(true);
							btnDelete.setEnabled(true);
						} else if (selectedSize > 1) {
							selectedModels = be.getSelection();
							btnDelete.setEnabled(true);
							btnRenovar.setEnabled(false);
							btnNuevo.setEnabled(false);
							btnCancelar.setEnabled(false);
							renovarletradialog.unbind();
						}

					}

				});

		listener = new Listener<MessageBoxEvent>() {

			@Override
			public void handleEvent(MessageBoxEvent be) {
				String button_id = be.getButtonClicked().getItemId();
				if (Dialog.YES == button_id) {
					if (selectedSize == 1) {
						Integer id = selectedModel.get("id");
						Letras.delete(id);
					}
					if (selectedSize > 1) {
						String ids = Utilities.toIds(selectedModels);
						Letras.deleteAll(ids);
					}

				}
			}
		};
		sl_delete = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				String mensaje = "";
				if (selectedSize == 1) {
					String nombres = selectedModel.get("numeroletra");
					mensaje = msg.letraEstaseguro(nombres);

				} else if (selectedSize > 1) {
					mensaje = k.eliminarAll();

				}
				MessageBox.confirm(k.confirmacion(), mensaje, listener)
						.getDialog().getButtonById(Dialog.YES).setText(k.si());

			}
		};

		btnDelete.addSelectionListener(sl_delete);

		ls_cancelar = new Listener<MessageBoxEvent>() {

			@Override
			public void handleEvent(MessageBoxEvent be) {
				String button_id = be.getButtonClicked().getItemId();
				if (Dialog.YES == button_id) {
					if (selectedSize == 1) {
						Integer id = selectedModel.get("id");
						Letras.cancelar(id);
					}
					

				}
			}
		};
		sl_cancelar = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				String mensaje = "";
				if (selectedSize == 1) {
					String letra = selectedModel.get("numeroletra");
					mensaje = msg.letraDeseaCancelar(letra);

				} else if (selectedSize > 1) {
					mensaje = k.eliminarAll();

				}
				MessageBox.confirm(k.confirmacion(), mensaje, ls_cancelar)
						.getDialog().getButtonById(Dialog.YES).setText(k.si());

			}
		};

		btnCancelar.addSelectionListener(sl_cancelar);

		btnNuevo.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				new PagoLetraDialog().show();
			}
		});
		btnRenovar.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				renovarletradialog.show();

			}
		});

		setTopComponent(toolbar);
		setBottomComponent(toolBarPag);

		add(grid);

	}

	public Integer getAnio(Date date) {
		if (null == date) {
			return 0;
		} else {
			String formato = "yyyy";
			DateTimeFormat dateFormat = DateTimeFormat.getFormat(formato);
			return Integer.parseInt(dateFormat.format(date));
		}
	}

	public Integer getDia(Date date) {
		if (null == date) {
			return 0;
		} else {
			String formato = "dd";
			DateTimeFormat dateFormat = DateTimeFormat.getFormat(formato);
			return Integer.parseInt(dateFormat.format(date));
		}
	}

	public Integer getMes(Date date) {
		if (null == date) {
			return 0;
		} else {
			String formato = "MM";
			DateTimeFormat dateFormat = DateTimeFormat.getFormat(formato);
			return Integer.parseInt(dateFormat.format(date));
		}
	}
	
	

}
